#include<semaphore.h>
#include<pthread.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

sem_t sem;
char buf[1024];
int stop = 0;

void * thread_func(void *){
    // 当 stop 为 false 时循环执行
    while(!stop){
        // 等待信号量
        sem_wait(&sem);
        // 打印读取到的数据
        printf("Data read: %s, %d,\n", buf, strlen(buf));
        // 清空缓冲区
        memset(buf, 0, sizeof(buf));
    }
    // 打印子线程退出信息
    printf("child thread exit\n");
    return NULL;
}

int main(){
    // 初始化信号量
    int res = sem_init(&sem,0, 0);
    if(res < 0){
        // 如果初始化失败，输出错误信息并退出程序
        perror("sem_init");
        exit(1);
    }

    // 创建线程
    pthread_t tid;
    res = pthread_create(&tid, NULL, thread_func, buf);
    if(res){
        // 如果创建线程失败，输出错误信息并退出程序
        perror("pthread_create");
        exit(1);
    }

    // 循环读取输入，直到输入为"quit"
    do{
        // 从标准输入读取一行
        fgets(buf, sizeof(buf), stdin);
        // 发布信号量，通知线程可以执行
        sem_post(&sem);
    }while(strcmp(buf, "quit\n") != 0);

    // 设置停止标志
    stop = 1;
    // 等待线程结束
    pthread_join(tid, NULL);
    // 输出主线程退出信息
    printf("main thread exit\n");
    return 0;
}